Короткий огляд процесу трансляції.
Основою будь-якої природної або штучної мови є алфавіт − набір допустимих у даній мові елементарних знаків. Для природних мов це букви і знаки пунктуації, для мов програмування − латинські букви, цифри, спеціальні символи. Знаки можуть об'єднуватись у слова − елементарні конструкції мови, які розглядаються у тексті (програмі) як неподільні символи, що мають певний зміст. Словом може бути і окремий знак. Наприклад, у мові програмування словами вважаються ідентифікатори, службові слова, константи, а також односимвольні або двосимвольні позначення операцій, дужки, коми та ін. Словарний склад мови разом з описом способів їх зображення утворюють лексику мови.
Слова у мові об'єднуються у складніші конструкції − речення. У мовах програмування найпростішим реченням є оператор. Взагалі речення будуються із слів та простіших речень згідно з правилами синтаксису. Синтаксис мови − це опис правильних речень. Опис змісту речень, тобто значень слів та їх внутрішніх зв'язків, утворює семантику мови.
Переклад програми з одної мови на іншу, у загальному випадку, полягає у зміні алфавіту, лексики і синтаксису програми із збереженням її семантики. Процес трансляції вхідної програми в об'єктну розбивається на декілька незалежних підпроцесів.
Складові частини компілятора
Транслятор повинен виконати аналіз вхідної програми, а потім синтез об'єктної програми. Спочатку вхідна програма розкладається на її складові частини, а потім з них будуються ( складаються) частини еквівалентної об'єктної програми. Для цього на етапі аналізу будуються декілька таблиць, які використовуються потім як при аналізі, так і при синтезі.
На наступній схемі весь процес показано детальніше. Пунктирні стрілки зображають інформаційні потоки, а суцільні стрілки вказують порядок роботи програм.
Опишемо коротко різні частини компілятора (транслятора).
Інформаційні таблиці.
При аналізі програм з описів, заголовків процедур, заголовків циклів і т.д. вибирається інформація і зберігається для подальшого використання. Ця інформація виявляється в окремих точках програми і організовується так, щоб до неї можна було звернутись з будь-якої частини компілятора. Наприклад, при кожному використанні ідентифікатора необхідно знати, як був описаний цей ідентифікатор і як він використовувався в інших місцях програми. Конкретна інформація, що зберігається, залежить від вхідної мови, об’єктної мови і складності компілятора. Але у кожному компіляторі використовується таблиця символів ( інші назви − таблиця імен або список ідентифікаторів). Це таблиця ідентифікаторів, які зустрічаються у вхідній програмі, разом з їх атрибутами ( тип ідентифікатора, його адреса в об'єктній програмі та інша інформація, яка може бути потрібна для трансляції).
Таблиця констант включає саму константу і відповідна адреса в об'єктній програмі.
Таблиця заголовків циклів відображає структуру вкладень циклів. У ній зберігається інформація про змінні циклів.
При розробці компілятора неможливо визначити вигляд і зміст інформації, яку варто збирати, до того часу, поки не будуть досить ретельно продумані команди об'єктної програми для кожної інструкції вхідної програми і сама об'єктна частина компілятора.
SHAPE \* MERGEFORMAT
КОМПІЛЯТОР
СИНТЕЗ
Вхідна програма
АНАЛІЗ
Лексичний
аналізатор
(сканер)
Синтаксичний
і
семантичний
аналізатори
Підготовка
до генерації
команд
Генерація команд
Об'єктна програма
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
Мал.1 Логічні частини компілятора.
Сканер (лексичний аналізатор).
Сканер (лексичний аналізатор) − найпростіша частина компілятора. Сканер проглядає літери вхідної програми зліва направо і будує символи (лексеми, слова, атоми) програми − цілі числа, ідентифікатори, службові слова, дволітерні розділювачі. Символи передаються після цього н...